import numpy as np
import matplotlib.pyplot as plt
import math
from scipy.integrate import quad

def visualize_signed_area():
    """可视化有正负面积的函数积分"""
    
    # 设置中文字体，防止乱码
    plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']
    plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
    
    # 创建一个在x轴上下都有值的函数
    x = np.linspace(0, 4, 1000)
    y = np.sin(x)  # 正弦函数在区间内会穿越x轴
    
    fig, ax = plt.subplots(figsize=(12, 8))
    
    # 绘制函数曲线
    ax.plot(x, y, 'b-', linewidth=3, label='y = sin(x)')
    ax.axhline(y=0, color='k', linestyle='-', alpha=0.3)  # x轴
    
    # 计算各部分面积 - 修复：取quad返回值的第一个元素
    area_positive_value = quad(lambda x: max(0, np.sin(x)), 0, 4)[0]  # 正面积
    area_negative_value = quad(lambda x: min(0, np.sin(x)), 0, 4)[0]  # 负面积
    total_area_value = quad(lambda x: np.sin(x), 0, 4)[0]  # 总面积（代数和）
    
    # 填充不同区域（不同颜色）
    # x轴上方区域（正面积）
    ax.fill_between(x, y, where=y>0, alpha=0.3, color='green', label=f'正面积: {area_positive_value:.2f}')
    # x轴下方区域（负面积）
    ax.fill_between(x, y, where=y<0, alpha=0.3, color='red', label=f'负面积: {area_negative_value:.2f}')
    
    # 添加标注 - 修复：使用正确的变量
    ax.text(1, 0.8, f'正面积: {area_positive_value:.2f}', fontsize=12, 
            bbox=dict(boxstyle="round,pad=0.3", facecolor="lightgreen"))
    ax.text(2.5, -0.8, f'负面积: {area_negative_value:.2f}', fontsize=12,
            bbox=dict(boxstyle="round,pad=0.3", facecolor="lightcoral"))
    ax.text(2, 1.2, f'定积分值: {total_area_value:.2f}', fontsize=14, ha='center', 
            bbox=dict(boxstyle="round,pad=0.3", facecolor="yellow"))
    
    # 标记零点
    zeros = [np.pi, 2*np.pi]  # sin(x)在[0,4]内的零点
    for zero in zeros:
        if zero <= 4:
            ax.axvline(x=zero, color='gray', linestyle='--', alpha=0.5)
            ax.text(zero, -0.2, f'x={zero:.2f}', ha='center', fontsize=10)
    
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    ax.set_title('定积分的几何意义：正负面积的代数和')
    ax.grid(True, alpha=0.3)
    ax.legend()
    ax.set_xlim(0, 4)
    
    plt.tight_layout()
    plt.show()
    
    # 打印详细结果
    print("=" * 50)
    print("积分结果分析:")
    print("=" * 50)
    print(f"正面积 (绿色区域): {area_positive_value:.6f}")
    print(f"负面积 (红色区域): {area_negative_value:.6f}")
    print(f"定积分值 (代数和): {total_area_value:.6f}")
    print(f"总面积 (绝对值之和): {abs(area_positive_value) + abs(area_negative_value):.6f}")

# 执行函数
visualize_signed_area()